package com.xuantu.learn.ssh.dao;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * User: ping
 * Date: 14-9-29
 * Time: 下午3:02
 */
public interface ICommonDAO {

    /**
     * 保存
     * @param model
     * @param <T>
     * @return
     */
    public <T extends Serializable> T save(T model);

    /**
     * 保存或更新
     * @param model
     * @param <T>
     */
    public <T extends Serializable> void saveOrUpdate(T model);

    /**
     * 更新
     * @param model
     * @param <T>
     */
    public <T extends Serializable> void update(T model);

    /**
     * 保存或更新
     * @param model
     * @param <T>
     */
    public <T extends Serializable> void merge(T model);

    /**
     * 更新主建删除
     * @param entityClass
     * @param id
     * @param <T>
     * @param <PK>
     */
    public <T extends Serializable, PK extends Serializable> void delete(Class<T> entityClass, PK id);

    /**
     * 删除实体
     * @param model
     * @param <T>
     */
    public <T extends Serializable> void deleteObject(T model);

    /**
     * 根据ID查询实体
     * @param entityClass
     * @param id
     * @param <T>
     * @param <PK>
     * @return
     */
    public <T extends Serializable, PK extends Serializable> T get(Class<T> entityClass, PK id);

    /**
     * 所有记录条数
     * @param entityClass
     * @param <T>
     * @return
     */
    public <T extends Serializable> int count(Class<T> entityClass);

    /**
     * 根据hql统计记录数
     * @param hql
     * @param paramlist
     * @return
     */
    public int count(final String hql, final Object... paramlist);

    /**
     * 查询所有记录
     * @param entityClass
     * @param <T>
     * @return
     */
    public <T extends Serializable> List<T> listAll(Class<T> entityClass);

    /**
     * 分页查询
     * @param entityClass
     * @param pageNo
     * @param pageSize
     * @param <T>
     * @return
     */
    public <T extends Serializable> List<T> listAll(Class<T> entityClass, int pageNo, int pageSize);

    /**
     * 根据hql分页获取数据
     * @param hql Hql语句
     * @param pageNo 页数
     * @param pageSize 每页显示记录数
     * @param parameList 参数
     * @return
     */
    public <T extends Serializable> List<T> list(final String hql, int pageNo, int pageSize, Object... parameList);

    /**
     * 根据sql查询数据
     * @param sql
     * @param parameList
     * @return
     */
    public List<Map<String,Object>> listBySql(final String sql, Object... parameList);

    /**
     * 根据sql操作
     * @param sql
     * @param parameList
     */
    public void executeSql(String sql, Object... parameList);



}
